package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAlerta;
import com.mastercard.assets.jpa.TblNivel;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.CatalogoNuevoItemForm;
import com.mastercard.assets.web.struts.forms.LoginForm;
import com.mastercard.assets.web.struts.forms.NotificacionForm;
import com.mastercard.assets.web.util.to.UserLogin;

public class CrearNotificacionCrear
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el form
		NotificacionForm f = ( NotificacionForm ) form ;
		
		// toma los datos
		int operation = f.getOperation( ) ;
		int cveAlerta = f.getCveAlerta( ) ;
		int cveNivel = f.getCveNivel( ) ;
		int cveRole = f.getCveRole( ) ;
		int tipo = f.getTipo( ) ;
		int tipoNotificacion = f.getTipoNotificacion( ) ;
		String mail = f.getMail( ) ;
		
		try
		{
//			System.out.println( "Agregar Notificacion" ) ;
//			System.out.println( "Tipo: " + tipo ) ;
//			System.out.println( "Tipo Notificacion: " + tipoNotificacion ) ;
			
			MasterCardDAO.addNewNotification( tipoNotificacion , cveAlerta , cveRole , cveNivel , tipo , mail ) ;
			
			// en caso de que se cumpla, guarda el WorkArea
			user.setNextWorkArea( "/CalcularListaCatalogosNotificaciones.do" ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			// error y regresa a la pantalla
			user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.ErrorRegistering" , e.getMessage( ) ) ) ;
			
			// carga todo
			request.setAttribute( "CrearNotificacionCrearForm" , f ) ;
			
			// en caso de que se cumpla
			// calcula las alertas activas
			List< TblAlerta > alertas = MasterCardDAO.getAllActiveAlertas( ) ;
			
			// en caso de que no haya alertas
			if( alertas == null || alertas.size( ) == 0 )
			{
				user.setMessageError( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayAlertas" ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
				return mapping.findForward( "error" ) ;
			}
			
			// en caso de una alerta solamente
			if( alertas.size( ) == 1 )
			{
				// guarda el numero de alerat
				f.setCveAlerta( alertas.get( 0 ).getCveAlerta( ) ) ;
			}
			
			request.setAttribute( "ActiveAlerts" , alertas ) ;
			
			// calcula los roles
			List< TblRole > roles = MasterCardDAO.getAllActiveRoles( ) ;
			
			// en caso de que no haya
			if( roles == null || roles.size( ) == 0 )
			{
				user.setMessageError( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayRoles" ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
				return mapping.findForward( "error" ) ;
			}
			
			// en caso de que cveRole venga mayor de 1
			if( f.getCveRole( ) > 0 )
			{
				// toma los nieles del role
				List< TblNivel > niveles = MasterCardDAO.getAllActiveLevelsFromRole( f.getCveRole( ) ) ;
				
				// guarda en el request
				request.setAttribute( "ActiveLevels" , niveles ) ;
				
				// en caso de que haya un solo nivel
				if( niveles != null && niveles.size( ) == 1 )
					f.setCveNivel( niveles.get( 0 ).getCveNivel( ) ) ;
				else
					f.setCveNivel( 0 ) ;
			}
			
			// calcula los roles activos
			request.setAttribute( "ActiveRoles" , roles ) ;
			
			user.setMessageError( "/WEB-INF/pages/WorkArea/CrearNotificacion.jsp" ) ;
			
		}
                
		MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
	
}
